package com.yunke.service;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.yunke.dto.notification.YunkeSendNotificationDto;
import com.yunke.entity.YunkeUserNotification;
import com.yunke.vo.notification.YunkeNotificationVo;

import java.util.List;
import java.util.Map;

/**
 * 通知Service接口
 * 
 * @author yunke
 * @since 1.0.0
 */
public interface YunkeNotificationService extends IService<YunkeUserNotification> {

    /**
     * 发送通知
     * 
     * @param sendDto 发送通知信息
     * @return 发送结果
     */
    Map<String, Object> sendNotification(YunkeSendNotificationDto sendDto);

    /**
     * 批量发送通知
     * 
     * @param userIds 用户ID列表
     * @param sendDto 发送通知信息
     * @return 发送结果
     */
    Map<String, Object> batchSendNotification(List<Long> userIds, YunkeSendNotificationDto sendDto);

    /**
     * 获取我的通知列表
     * 
     * @param current 当前页
     * @param size 页面大小
     * @param notificationType 通知类型（可选）
     * @param isRead 是否已读（可选）
     * @return 通知列表
     */
    Page<YunkeNotificationVo> getMyNotificationList(Long current, Long size, Integer notificationType, Integer isRead);

    /**
     * 获取通知详情
     * 
     * @param notificationId 通知ID
     * @return 通知详情
     */
    YunkeNotificationVo getNotificationDetail(Long notificationId);

    /**
     * 标记通知为已读
     * 
     * @param notificationId 通知ID
     * @return 操作结果
     */
    Map<String, Object> markAsRead(Long notificationId);

    /**
     * 批量标记为已读
     * 
     * @param notificationIds 通知ID列表
     * @return 操作结果
     */
    Map<String, Object> batchMarkAsRead(List<Long> notificationIds);

    /**
     * 全部标记为已读
     * 
     * @param notificationType 通知类型（可选）
     * @return 操作结果
     */
    Map<String, Object> markAllAsRead(Integer notificationType);

    /**
     * 删除通知
     * 
     * @param notificationId 通知ID
     * @return 操作结果
     */
    Map<String, Object> deleteNotification(Long notificationId);

    /**
     * 批量删除通知
     * 
     * @param notificationIds 通知ID列表
     * @return 操作结果
     */
    Map<String, Object> batchDeleteNotification(List<Long> notificationIds);

    /**
     * 清空通知
     * 
     * @param notificationType 通知类型（可选）
     * @return 操作结果
     */
    Map<String, Object> clearNotifications(Integer notificationType);

    /**
     * 获取未读消息统计
     * 
     * @return 未读消息统计
     */
    Map<String, Object> getUnreadNotificationCount();

    /**
     * 获取通知设置
     * 
     * @return 通知设置
     */
    Map<String, Object> getNotificationSettings();

    /**
     * 更新通知设置
     * 
     * @param settings 通知设置
     * @return 操作结果
     */
    Map<String, Object> updateNotificationSettings(Map<String, Object> settings);

    /**
     * 发送系统通知（管理员）
     * 
     * @param sendDto 发送信息
     * @return 发送结果
     */
    Map<String, Object> sendSystemNotification(YunkeSendNotificationDto sendDto);

    /**
     * 发送广播通知（管理员）
     * 
     * @param sendDto 发送信息
     * @return 发送结果
     */
    Map<String, Object> sendBroadcastNotification(YunkeSendNotificationDto sendDto);

    /**
     * 获取通知统计（管理员）
     * 
     * @return 通知统计
     */
    Map<String, Object> getNotificationStatistics();

    /**
     * 处理异步通知发送
     * 
     * @param notification 通知对象
     */
    void processAsyncNotification(YunkeUserNotification notification);

    /**
     * 自动发送点赞通知
     * 
     * @param fromUserId 点赞用户ID
     * @param toUserId 被点赞用户ID
     * @param relatedType 关联类型
     * @param relatedId 关联ID
     */
    void sendLikeNotification(Long fromUserId, Long toUserId, Integer relatedType, Long relatedId);

    /**
     * 自动发送评论通知
     * 
     * @param fromUserId 评论用户ID
     * @param toUserId 被评论用户ID
     * @param relatedType 关联类型
     * @param relatedId 关联ID
     * @param content 评论内容
     */
    void sendCommentNotification(Long fromUserId, Long toUserId, Integer relatedType, Long relatedId, String content);

    /**
     * 自动发送关注通知
     * 
     * @param fromUserId 关注用户ID
     * @param toUserId 被关注用户ID
     */
    void sendFollowNotification(Long fromUserId, Long toUserId);
} 